home *** CD-ROM | disk | FTP | other *** search
/ MacHack 1996 / MacHack 1996.toast / Hacks / Hacks '96 / Internet Chooser / reggie / basic / patches.c next >
Encoding:
Text File  |  1996-06-22  |  2.7 KB  |  104 lines  |  [TEXT/MMCC]

  1. // File "patches.c" -
  2.  
  3. /* **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** */
  4. /* **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** */
  5. /* Include Files */
  6.  
  7. #include <A4Stuff.h>
  8. #include <Traps.h>
  9.  
  10. #include "stdtypes.h"
  11. #include "stddebug.h"
  12.  
  13. #include "patches.h"
  14.  
  15. /* **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** */
  16. /* **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** */
  17. /* Global Declarations */
  18.  
  19. static pascal void PatchE2S(void);
  20.  
  21. #if GENERATINGCFM
  22. static RoutineDescriptor gPatchE2SRD = 
  23.         BUILD_ROUTINE_DESCRIPTOR(uppExitToShellProcInfo, PatchE2S);
  24. static ExitToShellUPP gPatchE2SUPP = &gPatchE2SRD;
  25. #else
  26. static ExitToShellUPP gPatchE2SUPP = PatchE2S;
  27. #endif
  28. static ExitToShellUPP gSaveE2SUPP = 0;
  29. static QHdr gE2STaskQ;
  30.  
  31. /* **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** */
  32. /* **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** */
  33.  
  34. SInt32 InstallE2STask(E2STaskProc taskProc, void *taskData) {
  35.     SInt32 error = 0;
  36.     E2STaskPtr taskElem;
  37.     
  38.     if (!gSaveE2SUPP) {
  39.         UInt16 trap = _ExitToShell; 
  40.         
  41. #if GENERATINGPOWERPC
  42.         MakeDataExecutable(&gPatchE2SRD, sizeof(gPatchE2SRD));
  43. #endif
  44.  
  45.         gSaveE2SUPP = (ExitToShellUPP) 
  46.                 NGetTrapAddress(trap, (trap & 0x0800) ? ToolTrap : OSTrap);
  47.         NSetTrapAddress((UniversalProcPtr) gPatchE2SUPP,
  48.                 trap, (trap & 0x0800) ? ToolTrap : OSTrap);
  49.             
  50.         gE2STaskQ.qHead = 0;
  51.         }
  52.     
  53.     qThrowIfNull(taskElem = (E2STaskPtr) NewPtr(sizeof(E2STask)), MemError(), "");
  54.     taskElem->proc = taskProc;
  55.     taskElem->data = taskData;
  56.     Enqueue((QElem *) taskElem, &gE2STaskQ);
  57.  
  58. /* CATCH */
  59.     qCatch();
  60.     return(error);
  61.     }
  62.  
  63. /* **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** */
  64. /* **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** */
  65.  
  66. void RemoveE2STask(E2STaskProc taskProc, void *taskData) {
  67.     E2STaskPtr taskElem;
  68.     
  69.     while(taskElem = (E2STaskPtr) gE2STaskQ.qHead) {
  70.         if ((taskElem->proc == taskProc) && (taskElem->proc == taskProc))
  71.             Dequeue((QElem *) taskElem, &gE2STaskQ);
  72.         }
  73.     }
  74.  
  75. /* **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** */
  76. /* **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** */
  77.  
  78. pascal void PatchE2S() {
  79. #if GENERATINGCFM || __A5__
  80.     UInt32 saveA5 = SetCurrentA5();
  81. #else
  82.     UInt32 saveA4 = SetCurrentA4();
  83. #endif
  84.     ExitToShellUPP tempE2SUPP;
  85.     E2STaskPtr taskElem;
  86.     
  87.     while(taskElem = (E2STaskPtr) gE2STaskQ.qHead) {
  88.         Dequeue((QElem *) taskElem, &gE2STaskQ);
  89.         (*taskElem->proc)(taskElem->data);
  90.         }
  91.     
  92.     // Stash off the global before resetting globals register
  93.     tempE2SUPP = gSaveE2SUPP;
  94.  
  95. #if GENERATINGCFM || __A5__
  96.     SetA5(saveA5);
  97. #else
  98.     SetA4(saveA4);
  99. #endif
  100.  
  101.     CallExitToShellProc(tempE2SUPP);
  102.     }
  103.  
  104.